import 'package:elevator_app/apis/base.dart';
import 'package:flutter/material.dart';
import "package:get/get.dart";
import 'package:pull_to_refresh/pull_to_refresh.dart';

import '../../../../apis/repairs.dart';
import '../../../../components/date_range/date_range.dart';
import '../../../../components/status/toast.dart';
import '../../../../controller/gather_ctrl.dart';
import '../../../../controller/network/bridge.dart';
import '../../../../controller/network/network_ctrl.dart';
import '../../../../model/bean/community_bean.dart';
import '../../../../model/bean/repairs_list_bean.dart';
import '../../../../router/router.dart';

class RepairsListCtrl extends GatherCtrl {
  // 标记组件是否处于激活状态
  final isActivateStatus = false.obs;

  // 查看网络状态
  final _nc = Get.find<NetworkCtrl>();

  // 标记符号（用于检查请求完成后无数据组件与数据组件之的切换）
  final MARKSYMBOL = false.obs;

  // 组件是否初始化完成
  RxBool isInitComplete = false.obs;

  // 选项卡（1：已维修，0：未维修）
  final status = 0.obs;

  // 小区数据集合、选中的小区数据
  final communityData = Rx<List<DropdownMenuItem<CommunityBean>>>();
  final selectedCommunity = Rx<CommunityBean>();

  // 日期区间
  final selectedDateRange = "请选择时间".obs;

  // 请求参数
  final Map<String, dynamic> params = {
    "isHandle": 0,
    "villageId": "",
    "buildingId": "",
    "startTime": "",
    "endTime": "",
    "page": 1,
    "rows": 50,
  }.obs;

  // 所有小区ID集合
  final RxString allID = ''.obs;

  //申明上拉加载更多的状态
  final refreshController = RefreshController().obs;
  final flags = true.obs;

  // 数据列表
  final listData = <RepairsBean>[].obs;
  final total = 0.obs;

  @override
  void onInit() {
    // 创建网络变化观察
    Bridget.createNetworkCtrl(this);

    // 标记组件为激活状态
    isActivateStatus.value = true;

    // 初始化页面
    readCommunityList(callback: () => readPageDataList());

    // readPageDataList();
  }

  @override
  void onClose() {
    // 移除观察
    Bridget.delNetworkCtrl(this);
  }

  @override
  void modify() {
    if (isActivateStatus.value) {
      if (_nc.networkStatus.value && listData.length <= 0) {
        readPageDataList(isToast: true);
      }
    }
  }

  /// 读取小区列表
  /// * [callback] Function|回调函数|选填{Function callback}
  void readCommunityList({Function callback}) async {
    List<String> _ls = [];

    if (CommunityListBean.getCommunityAll().isEmpty) {
      try {
        // 获取小区列表数据
        await Base.queryCommunity();
      } catch (e) {
        Toast.fail(title: '小区获取失败');
        isInitComplete.value = true;
      }
    }

    // 赋值小区集合
    communityData.value = CommunityListBean.getCommunityAll();

    // 叠加所有的id
    communityData.value.forEach((e) {
      if (e.value.id.isNotEmpty) _ls.add(e.value.id);
    });

    // 存储所有小区id
    allID.value = _ls.join(',');
    params["villageId"] = allID.value;

    // 执行回调
    callback();
  }

  /// 读取界面数据
  /// * [isToast] bool|是否展示动画框|选填|默认值：false
  /// * [isReset] bool|是否清空数据|选填|默认值：false
  /// * [callback] Function|回调函数|选填
  void readPageDataList({
    bool isToast = false,
    bool isReset = false,
    Function callback = null,
  }) async {
    // 开启轻提示
    if (isToast) Toast.loading(title: '正在读取');

    // 请求数据
    RepairsListBean result = await Repairs.queryRepairsList(params);

    // 是否重置数据
    if (isReset) listData.clear();

    // 赋值
    if (result != null && result.list != null) {
      listData.addAll(result.list.obs);
      total.value = result.total;

      // 存在数据需要渲染
      if (result.list.length > 0) {
        MARKSYMBOL.value = true;
      } else {
        MARKSYMBOL.value = false;
      }

      // 累加页码
      if (result.list.length > 0 && listData.value.length > 0) {
        params["page"] = params["page"] + 1;
      }

      // 没有更多数据了
      if (listData.length >= total.value) {
        refreshController.value.loadNoData();
        flags.value = false;
      }
    }

    // 完成加载更多通知
    refreshController.value.loadComplete();

    // 开启轻提示
    if (isToast) Toast.closeToast();

    // 执行回调获取小区列表
    if (callback != null) {
      await callback();
    }

    // 标记页面加载状态（初始化）
    if (!isInitComplete.value) isInitComplete.value = true;
  }

  /// 选项卡发送变化触发
  /// * [value] int|被选中的选项卡|必填
  void onChangeSelectStatus(int value) {
    // 修改选中状态
    status.value = value;
    params['isHandle'] = value;
    params['page'] = 1;

    // --
    readPageDataList(isToast: true, isReset: true);
  }

  /// 设置下拉框选中的数据
  /// [val] CommunityBean|选中的数据|必填
  void setDropDownSelectedData(CommunityBean val) async {
    // 赋值小区id
    params["villageId"] = val.id.isEmpty ? allID : val.id;
    params["page"] = 1;
    flags.value = true;

    // 设置选中的数据（用于回显）
    selectedCommunity.value = val;

    // 请求数据
    readPageDataList(isToast: true, isReset: true);
  }

  /// 获取选中的日期区间
  /// * [context] BuildContext|上下文|必填
  void getDateRange(BuildContext context) {
    DateTimes.showDateRangePickers(
      context,
      firstDate: DateTime(1900),
      callBack: (DateTimeRangeResult dateRange) {
        // 执行请求参数
        params["startTime"] = dateRange.start;
        params["endTime"] = dateRange.end;
        params["page"] = 1;
        flags.value = true;

        // 设置界面展示状态
        selectedDateRange.value = "${dateRange.start} 至 ${dateRange.end}";

        // 请求数据
        readPageDataList(isToast: true, isReset: true);
      },
    );
  }

  /// 清空日期选项
  void emptyDateRange() {
    if (selectedDateRange.value != "请选择时间") {
      // 清空日期选项
      selectedDateRange.value = "请选择时间";
      params["startTime"] = "";
      params["endTime"] = "";
      params["page"] = 1;
      flags.value = true;

      // 请求数据
      readPageDataList(isToast: true, isReset: true);
    }
  }

  /// 离开当前页面，记录返回动作
  /// * [arg] Map|选填
  void onLeave({Map arg}) {
    // 标记组件为非激活状态
    isActivateStatus.value = false;

    Get.toNamed(
      AppRoutes.RepairsDetails,
      arguments: arg,
    ).then((value) {
      if (value != null && value) {
        params["page"] = 1;
        readPageDataList(isToast: true, isReset: true);
      }

      // 标记组件为激活状态
      isActivateStatus.value = true;
    });
  }

  /// 上拉加载更多
  void onLoading() {
    if (flags.value) {
      readPageDataList();
    } else {
      refreshController.value.loadNoData();
    }
  }
}
